package com.exam.controller;

import com.exam.entity.*;
import com.exam.serviceimpl.FillQuestionServiceImpl;
import com.exam.serviceimpl.JudgeQuestionServiceImpl;
import com.exam.serviceimpl.MultiQuestionServiceImpl;
import com.exam.serviceimpl.PaperServiceImpl;
import com.exam.util.ApiResultHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

@RestController
public class PaperController {

    @Autowired
    private PaperServiceImpl paperService;

    @Autowired
    private JudgeQuestionServiceImpl judgeQuestionService;

    @Autowired
    private MultiQuestionServiceImpl multiQuestionService;

    @Autowired
    private FillQuestionServiceImpl fillQuestionService;

    @GetMapping("/papers")
    public ApiResult<PaperManage> findAll() {
       ApiResult res =  ApiResultHandler.buildApiResult(200,"请求成功",paperService.findAll());
       return  res;
    }

    /** 模块-页面：我的试卷/我的练习-选中某场考试后的页面展示、“开始答题”按钮
     * 经过一次对选中试卷的查询所有，前端已经获得该paperId，可直接向后台发送此请求。
       先根据当前paperId在中间表paper_manager中查找指定题目类型的questionId，在此范围内查询指定题型xxx_question表中的题目记录，以确保查到的题目是经过试卷组装的。
       分别对三种题型表xxx_question进行如上查询，并封装所有题目记录到相应的List集合中，即代表三种题型各自的题库。
       将题目类型questionType和相应的题库封装到map集合中，返回给前端进行页面展示。点击“点击查看试题详情”即可看到三种题型的题库。
     * @param paperId
     * @return
     */
    @GetMapping("/paper/{paperId}")
    public Map<Integer, List<?>> findById(@PathVariable("paperId") Integer paperId) {
        List<MultiQuestion> multiQuestionRes = multiQuestionService.findByIdAndType(paperId);   //选择题题库 1
        List<FillQuestion> fillQuestionsRes = fillQuestionService.findByIdAndType(paperId);     //填空题题库 2
        List<JudgeQuestion> judgeQuestionRes = judgeQuestionService.findByIdAndType(paperId);   //判断题题库 3
        Map<Integer, List<?>> map = new HashMap<>();
        map.put(1,multiQuestionRes);
        map.put(2,fillQuestionsRes);
        map.put(3,judgeQuestionRes);
        return map;
    }

    /** 新增一条记录到中间表paper_manager中
     * 接收到前端addAnswerChildren.vue中传来的异步请求，将请求数据封装的对象postPaper插入到paper_manager表中。
      （前端通过一次查询已经获得选中的paperId，再通过向后台请求查询新增题目的questionId，同时在前端设置questionType题目类型，完成postPaper对象的封装）
     * @param paperManage
     * @return
     */
    @PostMapping("/paperManage")
    public ApiResult add(@RequestBody PaperManage paperManage) {
        int res = paperService.add(paperManage);
        if (res != 0) {
            return ApiResultHandler.buildApiResult(200,"添加成功",res);
        }
        return ApiResultHandler.buildApiResult(400,"添加失败",res);
    }
}
